package com.mju.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.mju.pojo.Order;
import com.mju.pojo.OrderItem;
import com.mju.pojo.Receive;
import com.mju.vo.OrderVo;

import java.util.List;

public interface IOrderService {
    /**
     * 创建订单
     * @param aid 收获地址id
     * @param cids 购物车id
     * @param uid 用户id
     * @param username 用户名
     * @return
     */
    Order createOrder(Integer aid, Integer[] cids, Integer uid, String username);

    // 创建订单项
    Integer createOrderItem(Integer oid, Integer cid, Integer num, String username);

    /**
     * 根据oid获取订单详情信息
     * @param oid
     * @return
     */
    List<OrderVo> queryOrderVoByOid(Integer oid);
    /**
     * 根据uid获取订单详情信息
     * @param uid
     * @return
     */
    List<OrderVo> queryOrderVoByUid(Integer uid);

    /***
     * 根据uname获取订单
     * @param uname
     * @return
     */
    List<OrderVo> queryOrderVoByUname(String uname);

    /**
     * 根据uid获取订单信息(非详情信息)
     * @param uid
     * @return
     */
    List<Order> queryOrderByUid(Integer uid);

    /**
     * 修改订单状态
     * @param oid
     * @return
     */
    Boolean updateStatusByOid(Integer oid,Integer status);

    /**
     * 无条件查询所有订单信息
     * @param currentPage
     * @param pageSize
     * @return
     */
    IPage<Order> queryAllOrderInfo(Integer currentPage, Integer pageSize);

    /**
     * 条件查询所有订单信息
     * @param currentPage
     * @param pageSize
     * @param order
     * @return
     */
    IPage<Order> conQueryAllOrderInfo(Integer currentPage, Integer pageSize,Order order);

    // 根据oid查询所有的订单项
    // 限制：一个人只能买5件商品
    List<OrderVo> queryOrderItemByOid(Integer oid);


    // 删除订单(以及订单项)
    Integer deleteOrderByOid(Integer oid);

    // 根据oid获取某个订单信息
    Order queryOrderByOid(Integer oid);


    /***
     * 根据用户id，获取所有订单及其子订单
     * @param uid
     * @return
     */
    List<List<OrderVo>> queryAllOrderAndOrderItem(Integer uid);

    // 根据状态获取订单信息
    List<List<OrderVo>> queryOrderByStatus(Integer uid, Integer status);

    List<List<OrderVo>> queryOrderByTitle(Integer uid, String title);

    // 根据订单状态，获取订单信息
    List<OrderVo> queryOrderInfoByStatus(Integer status);

    // 管理员发货
    // 根据订单编号：查询到该数据
    // 输入：快递单号+快递名称
    // 修改订单状态
    void sendGoods(Integer oid, Integer expressId, String expressName);


    /*
    任务：已发货待退款
    流程：用户填写退款原因，提示用户，等待审核。修改状态为：已发货待退款。发给管理员，管理员进行审核。
    审核通过后：触发此路由http://localhost:10010/refundInfo/createrRefund/106/不喜欢
    */
    void refund(Integer oid, String refundReason);

    // 后台：退款审核
    void examineRefundInfo(Integer oid);

    void rejectRefund(Integer oid, String reason);

    // 前台：删除订单
    // 直接物理删除
    void deleteOrder(Integer oid);

    // 任务：确认收获
    // 修改状态为已完成
    // 可以进行订单评价

    // 确认收货
    void finishOrder(Integer oid);

    // 订单评价
    void commentOrder(Integer oid, String comment);

    /**
     * 条件查询所有回收单信息(条件：回收单id、用户id、模糊用户名、回收单状态)
     * @param currentPage
     * @param pageSize
     * @param order
     * @return
     */
    IPage<Receive> conQueryAllReceiveInfo(Integer currentPage, Integer pageSize, Order order);
}
